#if !defined(SDTERMCOMMON_H)
#define SDTERMCOMMON_H

#include "SDCommon.h"
#include "SDLog.h"
#include "SDThread.h"
#include "SDDualQueue.h"
#include "CmdProtocolStruct.h"

#ifdef WIN32
typedef signed __int64       int64_t;
typedef unsigned __int64     uint64_t;
#endif


//码流单包负载最大字节数
#define MAX_NALU_SIZE								900

//音频码流包大小均应小于MAX_PAYLOAD_LEN_AUDIO
#define MAX_PAYLOAD_LEN_AUDIO						2048

//视频码流包大小均应小于MAX_PAYLOAD_LEN_VIDEO, 在本应用中，我们在H264编码器中指定了Slice的最大
//值会小于以太网MTU（1500字节），此处按2048可以满足存放需求
#define	MAX_PAYLOAD_LEN_VIDEO						2048

#define	MAX_PAYLOAD_LEN_FILE						2048

//是否支持发送Smooth平滑处理
#define SUPPORT_SEND_SMOOTH_PROCESS					1
//Smooth处理时每隔一定时间发出一批数据，本宏即为发送间隔毫秒数
#define SMOOTH_PROCESS_INTERVAL_MS					5

//包类型
//无效包，接收线程直接丢弃
#define PACKET_INVALID_TYPE							10001
//视频码流包
#define PACKET_VIDEO_TYPE							10002
//音频码流包
#define PACKET_AUDIO_TYPE							10003
//设置SM4密钥
#define	PACKET_SM4_KEY_TYPE						    10004
//启用加密
#define	PACKET_CRYPT_EN_TYPE					    10005
//禁用加密
#define	PACKET_CRYPT_DIS_TYPE					    10006
//文件包
#define	PACKET_FILE_TYPE					        10007
//线程退出信令通知包
//#define	PACKET_THREAD_END_TYPE						10004
#define	PACKET_THREAD_END_TYPE						10010

//内部队列使用的数据包格式
typedef struct PacketHead
{
    //数据源ID
    UINT64     unSrcUid;
    //数据目的ID
    UINT64     unDstUid;
	//包类型：信令包、视频包、音频包
	UINT		nType;
	//包负载的实际长度
	UINT		nPayloadLen;
	//校验包头（保留），队列防错处理
	UINT		nCrcCode;
	//当前包进入队列的时间
	struct timeval tIn;
	//当前帧中NALU的数量
	UINT        unNALUNum;	
	//当前帧号
	UINT        unFrameIndex;
	//当前NALU序号
	UINT        unNALUIndex;		
	//是否是关键帧
	BYTE		byIsKey;
	//音视频位置索引
	BYTE		byIndex;
	//音视频编码格式 
    BYTE        byCodec;
}PacketHead;

typedef struct VideoStreamPack
{
	//包头部
	PacketHead tHead;
	//特定包头
	int64_t nPts;
	int64_t nDts;
	//包负载存放区
	char acPayload[MAX_PAYLOAD_LEN_VIDEO];  
}VideoStreamPack;

typedef struct AudioStreamPack
{
	//包头部
	PacketHead tHead;
	//特定包头
	int64_t nPts;
	int64_t nDts;
	//包负载存放区
	char acPayload[MAX_PAYLOAD_LEN_AUDIO];  
}AudioStreamPack;

typedef struct FileStreamPack
{
	//包头部
	PacketHead tHead;
	//包负载存放区
	char acPayload[MAX_PAYLOAD_LEN_FILE];  
}FileStreamPack;

//送外层视频码流时附带的信息
typedef struct VideoFrameInfo
{
	BOOL bPacketLost;
	BOOL bKeyFrame;
}VideoFrameInfo;


//送外层音频码流时附带的信息
typedef struct AudioFrameInfo
{
	UINT unCodecType;
	UINT unSampleRate;
	UINT unChannelNum;
}AudioFrameInfo;

/*
 *@ip  服务器IP
 *@port 服务器端口
 *@key 大小和MD5值长度一样，方便后期可以计算MD5
 */

struct stIdentity
{
	uint32_t port;
	uint8_t  ip[32];
	uint8_t  publickey[64];
	uint8_t  privkey[32];
};


#endif // !defined(SDTERMCOMMON_H)
